package com.zzyl.nursing.utils;

import com.zzyl.common.config.RuoYiConfig;
import com.zzyl.common.core.domain.AjaxResult;
import com.zzyl.common.utils.PDFUtil;
import com.zzyl.common.utils.file.FileUtils;
import com.zzyl.oss.AliyunOSSOperator;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

/**
 * 使用Apache PDFBox解析PDF内容的工具类
 */
@Component
public class PdfParserUtil {
    @Autowired
    private AliyunOSSOperator aliyunOSSOperator;
    @Autowired
    private RedisTemplate redisTemplate;


    /**
     * 解析PDF文件并返回文本内容
     *
     * @param filePath PDF文件路径
     * @return 提取的文本内容
     * @throws IOException 当文件操作出现错误时抛出
     */
    public static String parsePdfToString(String filePath) throws IOException {
        // 验证文件路径
        if (filePath == null || filePath.trim().isEmpty()) {
            throw new IllegalArgumentException("PDF文件路径不能为空");
        }

        File pdfFile = new File(filePath);
        // 验证文件是否存在
        if (!pdfFile.exists()) {
            throw new IOException("PDF文件不存在: " + filePath);
        }

        // 验证是否为文件
        if (!pdfFile.isFile()) {
            throw new IOException("路径不是一个文件: " + filePath);
        }

        return parsePdfFile(pdfFile);
    }

    /**
     * 解析PDF文件流并返回文本内容
     *
     * @param inputStream PDF文件输入流
     * @return 提取的文本内容
     * @throws IOException 当流操作出现错误时抛出
     */
    public static String parsePdfToString(InputStream inputStream) throws IOException {
        if (inputStream == null) {
            throw new IllegalArgumentException("PDF输入流不能为空");
        }

        PDDocument document = null;
        try {
            // 加载PDF文档
            document = PDDocument.load(inputStream);

            // 检查文档是否被加密
            if (document.isEncrypted()) {
                throw new IOException("无法解析加密的PDF文档");
            }

            // 创建PDF文本提取器
            PDFTextStripper stripper = new PDFTextStripper();

            // 可以设置提取的页码范围，默认提取所有页
            // stripper.setStartPage(1);
            // stripper.setEndPage(document.getNumberOfPages());

            // 提取文本
            return stripper.getText(document);
        } finally {
            // 确保文档被关闭
            if (document != null) {
                document.close();
            }
        }
    }

    /**
     * 解析PDF文件对象并返回文本内容
     *
     * @param pdfFile PDF文件对象
     * @return 提取的文本内容
     * @throws IOException 当文件操作出现错误时抛出
     */
    private static String parsePdfFile(File pdfFile) throws IOException {
        PDDocument document = null;
        try {
            // 加载PDF文档
            document = PDDocument.load(pdfFile);

            // 检查文档是否被加密
            if (document.isEncrypted()) {
                throw new IOException("无法解析加密的PDF文档: " + pdfFile.getAbsolutePath());
            }

            // 创建PDF文本提取器
            PDFTextStripper stripper = new PDFTextStripper();

            // 提取文本
            return stripper.getText(document);
        } finally {
            // 确保文档被关闭
            if (document != null) {
                document.close();
            }
        }
    }

    /**
     * 示例用法
     */
    public static void main(String[] args) {
        if (args.length < 1) {
            System.out.println("请提供PDF文件路径作为参数");
            return;
        }

        String pdfPath = args[0];
        try {
            String content = parsePdfToString(pdfPath);
            System.out.println("PDF内容提取成功，长度: " + content.length() + " 字符");
            System.out.println("----------------------------------------");
            System.out.println(content);
        } catch (Exception e) {
            System.err.println("解析PDF失败: " + e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * 通用上传请求（单个）
     */
    @PostMapping("/upload")
    public AjaxResult uploadFile(MultipartFile file,String idCardNo) throws Exception
    {
        try
        {
            // 上传并返回新文件名称
            String url = aliyunOSSOperator.upload(file.getBytes(), file.getOriginalFilename());
            AjaxResult ajax = AjaxResult.success();
            ajax.put("url", url);
            ajax.put("fileName", url);
            //ajax.put("newFileName", FileUtils.getName(url));
            ajax.put("originalFilename", file.getOriginalFilename());
            //Pdf文件读取为字符串
            String content = PDFUtil.pdfToString(file.getInputStream());
            redisTemplate.opsForHash().put("healthReport",idCardNo,content);
            return ajax;
        }
        catch (Exception e)
        {
            return AjaxResult.error(e.getMessage());
        }
    }
}
